package basic

import (
	"fmt"
	"io"
	"os"
	"strings"
)

func BasicIoMain() {
	str := strings.ToLower("Make a single string")
	println(str)
	fmt.Println(len(str))
}

func FileDemo() {
	// 指定文件名
	fileName := "example.txt"
	// 打开或者创建文件
	// os.O_CREATE: 如果文件不存在则创建
	// os.O_RDWR: 以读写的模式打开文件
	// 0644: 文件权限，相当于Unix的 rw-r--r--
	file, err := os.OpenFile(fileName, os.O_CREATE|os.O_RDWR, 0644)
	if err != nil {
		fmt.Println("Error opening or creating file", err)
		return
	}
	defer file.Close()

	// 检测文件信息
	info, err := file.Stat()
	if err != nil {
		fmt.Println("Error getting file info", err)
		return
	}

	if info.Size() == 0 {
		fmt.Println("File created and opened")
		// 向文件写入数据
		data := []byte("Hello, world!\n Hello, world!\n Hello, world!\n")
		n, err := file.Write(data)
		if err != nil {
			fmt.Println("Error writing to file", err)
			return
		}
		fmt.Printf("Wrote %d bytes to file\n", n)
	} else {
		fmt.Print("File opened\n")
	}
	// 读取文件内容
	buffer, err := ReadFrom(file, 1024)
	if err != nil {
		fmt.Println("Read data from file failed", err)
		return
	}
	fmt.Println(string(buffer))

}

// ReadFrom 从文件中读取数据
func ReadFrom(reader io.Reader, num int) ([]byte, error) {
	// 生成一个byte类型的数据
	p := make([]byte, num)
	n, err := reader.Read(p)
	if n > 0 {
		return p[:n], nil
	}

	return p, err
}
